package var;

// 当Java程序在进行赋值或者运算时,精度小 ==> 精度大 被称为 自动类型转换
/* 数据类型按精度(容量)大小排序
   char int long float double
   byte short int long float double
 */
public class AutoConvert {
    public static void main(String[] args) {

        // 1.当有多种类型数据混合运算时,系统会首先讲所有数据转换为 容量最大 的那种数据类型, 然后再进行计算
        int n1 = 10;
        //float d1 = n1 + 1.1;// 错误,结果为 double 型(8字节), 转换成float型(4字节)失败
        double d1 = n1 + 1.1;
        System.out.println(d1);
        float d2 = n1 + 1.1f;//正确,在运算前已转换为float型
        System.out.println(d2);

        // 2.当把精度大的数据类型赋值给精度小的数据类型时, 就会报错;反之会进行自动类型转换
        //int n2 = 1.1;// 错误 double -> int

        // 3.(byte, short) 和 char 之间不会相互自动转换
        // 当把具体数赋给 byte 时，(1)先判断该数是否在 byte 范围内，如果是就可以
        byte b1 = 10; // 对 , -128-127
        int n2 = 1; // n2 是 int
        //byte b2 = n2;// 错,精度大不可赋值给精度小
        // char c1 = b1; // 错误， 原因 byte 不能自动转成 char

        // 4.byte, short, char 他们三者可以计算, 在计算时首先转换为 int
        byte b2 = 1;
        byte b3 = 2;
        short s1 = 1;
        //short s2 = b2 + s1;// 错, b2 + s1 => int
        int s2 = b2 + s1;//对, b2 + s1 => int
        //byte b4 = b2 + b3; // 错误: b2 + b3 => int

        // 5.boolean 不参与转换

        // 6.自动提升原则:表达式结果的类型自动提升为 操作数中最大的类型
        byte b4 = 1;
        short s3 = 100;
        int num200 = 1;
        float num300 = 1.1F;
        double num500 = b4 + s3 + num200 + num300; //float -> double
        System.out.println(num500);
    }
}
